package bancosys.tec.security.impl.services.incluir;

import jmine.tec.di.annotation.Injected;
import jmine.tec.services.annotations.Execution;
import jmine.tec.services.annotations.Input;
import jmine.tec.services.annotations.Output;
import jmine.tec.services.annotations.ServiceImplementor;
import jmine.tec.services.api.ActionsEnum;

import org.apache.commons.codec.digest.DigestUtils;

import bancosys.tec.persist.dao.BaseDAO;
import bancosys.tec.security.impl.domain.User;

/**
 * Serviço para criação de usuário.
 * 
 * @author rodrigok
 */
@ServiceImplementor(action = ActionsEnum.INCLUIR)
public class UserService {

    public static final String IDENTIFICADOR = "Identificador";

    public static final String USERNAME = "Usuário";

    public static final String PASSWORD = "Senha";

    public static final String DATABASE_ID = "Database ID";

    // Injected
    private BaseDAO<User> userDAO;

    // Obrigatórios
    private String username;

    private String password;

    // Opcional
    private Long databaseID;

    /**
     * Cria um novo usuário com os parametros passado.
     * 
     * @return {@link User}
     */
    @Execution
    @Output(propertyName = IDENTIFICADOR)
    @SuppressWarnings("deprecation")
    public User execute() {
        User usuario = this.userDAO.createBean();
        usuario.setUsername(this.username);
        usuario.setPassword(this.password);

        if (this.databaseID != null) {
            usuario.getController().getSessionFactory().getCurrentSession().save(usuario, this.databaseID);
        }

        usuario.getPersister().save();
        return usuario;
    }

    /**
     * @param userDAO dao da entidade {@link User}
     */
    @Injected
    public void setUserDAO(BaseDAO<User> userDAO) {
        this.userDAO = userDAO;
    }

    /**
     * Define o nome do usuário.
     * 
     * @param username Nome do usuário
     */
    @Input(fieldName = USERNAME)
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * Define a senha para o usuário.
     * 
     * @param password senha do usuário.
     */
    @Input(fieldName = PASSWORD)
    public void setPassword(String password) {
        this.password = DigestUtils.md5Hex(password);
    }

    /**
     * @param databaseID the databaseID to set
     */
    @Input(fieldName = DATABASE_ID, required = false)
    public void setDatabaseID(Long databaseID) {
        this.databaseID = databaseID;
    }
}
